iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
Modern Web

.NET教我做人系列 第 5

Day 5 <泛型>到底是甚麼鬼?

  • 分享至 

  • xImage
  •  

昨天簡單的介紹了型別的分類,雖然我還有很多細節的地方都沒講道,我也會在後面的鐵人賽來做個調整。那今天我要來講甚麼呢,相信很多人知道C#是強型別,所以在很多型別的使用上限制了很多,所以我們需要一個方式來讓型別的使用更有彈性,哪就介紹到我們今天的主題泛型(Generics)

泛型 甚麼東西? 能吃嗎?

應該很多人跟我依樣剛接觸到這東西時也是一臉黑人問號,所以今天就由我來說明泛型是甚麼東西,他能幫我們甚麼忙!!!

泛型程式設計,簡稱泛型(Generic)是程式設計語言的一種風格或範式。泛型代碼可以讓你寫出根據自我需求定義、適用於任何類型的,靈活且可重用的函數和類型。它可以讓你避免重複的代碼,用一種清晰和抽像的方式來表達代碼的意圖。泛型的格式通常會長這樣 泛型類型 <型別參數T> ,而這個型別參數通常用 T 或 T1、T2…來代表,或者放 int、string等等,而由我所知常見的泛型可以用在方法(method)或者類別(class),除了這兩種還可以在很多地方看到泛型的運用。這裡我就以這兩種方式做個簡單的操作

這裡的話,我是先用方法(method)的方式來做個練習,這裡可以知道在Test<T>裡的型別參數會針對在實例化時做個設定像在下面就有針對 int、string、ExampleClass做參數的設定

public class ExampleClass{
    public string name {get; set;}
    public int id {get; set;}
    public bool sex {get; set;}
};
public static void Test<T>(T input)
{
    Console.WriteLine(input.GetType());
    Console.WriteLine(input);
}
static void Main(string[] args)
{
    Test<string>("hello world");
    Test<int>(123456789);
    ExampleClass exampleClass = new ExampleClass();
    exampleClass.name = "王八";
    exampleClass.id = 123456789;
    exampleClass.sex = true;

    Test<ExampleClass>(exampleClass);
}

最後跑完的結果應該會如下,那應該就沒什麼問題

System.String
hello world
System.Int32
123456789
Program+ExampleClass
Program+ExampleClass

下面的話就是針對類別(class)做的練習,其實做的方法跟方法很類似,這裡變成我們在類別加上型別參數,在實例化的地方把我們要設定的地方放入我們要使用的型態

public class Generic<T>
{
    public void Test(T input)
    {
        Console.WriteLine(input);
    }
}
private class ExampleClass{};
static void Main(string[] args)
{
    Generic<int> generic1 = new Generic<int>();
    generic1.Test(123456789);

    Generic<string> generic2 = new Generic<string>();
    generic2.Test("hello world");

    Generic<ExampleClass> generic3 = new Generic<ExampleClass>();
    generic3.Test(new ExampleClass());
}

最後來說說為甚麼需要泛型,在C#剛出現時並沒有甚麼泛型,是在2.0版本後加進來的功能,但是在有泛型之前我們需要建立一個型別的集合要怎麼辦呢?

依我所知在沒有泛型這方法之前是要透過 ArrayList 的方法來達成,然後在透過 ArrayList.Add() 新增內容,但這就會有個問題,新增資料時你不能確定每次的 object 都會是一樣的標準作新增,這就可能造成資料上無法達到統一性,所以泛型的出現解決的C#上類似的問題,除了解決在資料上通一的問題,也大幅減少 runtime 時期所消耗的效能

今天這主題也是突然想到有這東西,所以沒有準備得很充實,但是至少在簡單的理解與應用上也有一定的了解,那麼今天的鐵人賽就到這裡啦,我們明天見~~~


上一篇
Day 4 好的開始從了解基本的(架構、型態)開始
下一篇
Day 6 用LINE不如用LINQ
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言